package language.Enum;

public class enumTest {
    public static void main(String[] args) {



        //两种获得枚举对象的方法，都需要知道枚举的name
        Day day = Day.valueOf("MONDAY"); //1.根据name的字符串取得枚举对象MONDAY
        day = Day.MONDAY;                //2.直接取得枚举对象。用一个enum类型 Day 来修饰enum实例 MONDAY
        Day monday = Enum.valueOf(Day.class, "MONDAY");

        //遍历所有枚举。values方法返回所有Day的有序(ordinal顺序)实例数组。
        //values和valueOf是由编译器添加的static方法
        System.out.println("name\tordinal\tvalue");
        for (Day i: Day.values()){
            System.out.println(i.getNameAndOrdinal() + "\t" + i.getValue());
        }
        //在switch语句中使用枚举，是种理想的组合
        switch (day) {
            case MONDAY: //case的条件不要使用枚举的全限定名
        }
    }

    //创建enum时，会生成一个相关的类，这个类继承自java.lang.Enum，每个枚举对象都是该类的实例。
    //枚举类默认是使用final关键字修饰的，所以枚举类不能被继承；

    //反编译：
    //1、使用IDEA java-decompiler.jar对枚举类的反编译结果仅仅包含像我们正常编写的枚举类的一些信息；
    //2、使用javap或者show bytecode，就能看到static块，values()，valueof()这些方法。
    enum Day {
        // 每个枚举对象都是Day类的实例,初始化时会走Day的构造器给value一个初始值
        //name和ordinal是enum的默认属性，而Day类型自定义了一个叫value的字段
        //MONDAY("3")：定义一个name为“MONDAY”，ordinal为0，value为3的Day实例
        MONDAY("3"), TUESDAY("4"), WEDNESDAY("5");  //最后有一个分号

//        Enum默认有两个字段，name和ordinal，其中ordinal是声明顺序，默认从0开始，
        //自定义枚举类Day，可以设置自己的字段value
        private final String value;

        //枚举默认有一个private的无参构造器，所以可以用来实现单例模式。
        //有参构造器需要自己定义
        Day(String value) {
            this.value = value;
        }


        //可以向enum中添加普通方法
        public String getValue() {
            return value;
        }
        //使用内置方法name和ordinal
        public String getNameAndOrdinal(){
            return name() + "\t" + ordinal();
        }
    }
}
